"""
七牛云第三方存储, 运维成本低, 安全可靠
官方网站 http://www.qiniu.com
安装: pip install qiniu
"""


def upload_file(data):
    """
    上传文件到七牛云
    :param data: 要上传的二进制数据(bytes类型)
    :return: 图片的URL
    """

    from qiniu import Auth, put_data
    # 需要填写你的 Access Key 和 Secret Key
    access_key = 'kJ8wVO7lmFGsdvtI5M7eQDEJ1eT3Vrygb4SmR00E'
    secret_key = 'rGwHyAvnlLK7rU4htRpNYzpuz0OHJKzX2O1LWTNl'
    # 构建鉴权对象
    q = Auth(access_key, secret_key)
    # 要上传的空间
    bucket_name = 'sh35'
    # 上传后保存的文件名 (如果设置为None, 则七牛会为文件自动生成文件名, 可以保证文件名的唯一性, 本质是使用文件的哈希值作为文件名)
    # 哈希算法: 将任意长度的内容转换为定长的字符串(哈希值), 不同内容的哈希值也不同, 哈希值也称为数据的指纹
    key = None
    # 生成上传 Token，可以指定过期时间等
    token = q.upload_token(bucket_name, key, 3600)

    # 要上传的本地文件(上传文件路径)
    # localfile = '123.jpg'
    # ret, info = put_data(token, key, localfile)

    ret, info = put_data(token, key, data)
    # print(ret.get('key'))  # 字典
    # print(info)     # 响应信息
    if info.status_code == 200:  # 上传成功, 返回文件URL
        return 'http://qc3jddghy.bkt.clouddn.com/' + ret.get('key')
    else:
        raise BaseException(info.error)


if __name__ == '__main__':
    with open('123.jpg', 'rb') as f:
        file_bytes = f.read()
        # 上传二进制流到七牛云
        file_url = upload_file(file_bytes)
        # 输出图片url + 文件名(hash值)
        # http://qc3jddghy.bkt.clouddn.com/FvUTZhIshsbZkQ96Us4ZP8B4bpTb
        print(file_url)
